package com.continautos.seguridad.web;

import java.io.IOException;
import java.io.Serializable;
import java.util.Calendar;
import java.util.HashMap;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import com.continautos.common.enums.EMsgBundles;
import com.continautos.common.enums.EPermisos;
import com.continautos.common.enums.ETipoUsuario;
import com.continautos.common.persistence.DAOFactory;
import com.continautos.common.persistence.dto.CtaTbUsuario;
import com.continautos.common.util.WebUtils;
import com.continautos.common.web.CacheParametrosBean;
import com.continautos.common.web.UserSessionBean;

@ManagedBean(name = "loginBean")
@ViewScoped
public class LoginBean implements Serializable {

	private static final long serialVersionUID = 1L;

	private String usuario;
	private String clave;

	@ManagedProperty(value = "#{userSessionBean}")
	private UserSessionBean userSessionBean;

	private String mensajeLogin = "";
	
	private int idConcesionario;

	public LoginBean() {

	}

	public void limpiar() {

		setUsuario("");
		setClave("");

	}

	public String login() {

		// TODO Pones el outgone en el faces-config para el success de login.
		String result = "success";
		CtaTbUsuario usr = null;

		usr = authenticate();

		if (usr == null) {
			// TODO se pone el mensaje de falla en authenticacion.
			String message = WebUtils.getInstance().locatorMessage(
					EMsgBundles.SEGURIDAD.getStringValue(),
					"error_seguridad_login_authentication");

			result = "";
			mensajeLogin = "Usuario/clave no encontrado en el sistema";
		} else if (!authorization()) {
			// TODO se pone el mensaje de falla en authorization.
			result = "";
			System.out.println("Usuario sin autorization");
		}

		if (result == "success") {
			userSessionBean.setLogin(true);
			// userSessionBean.setUsuario(DAOFactory.getExpTbUsuarioDao().findWhereUsuarioEquals(usuario,"A")[0]);
			userSessionBean.setUsuario(usr);

			ETipoUsuario enumUsuario = CacheParametrosBean.getInstance()
					.obtenerTipoUsuario(usr.getPTipoUsuario());
			userSessionBean.setTipoUsuario(enumUsuario);

			userSessionBean.setIdConcesionario(idConcesionario);
			
			// Asigna los permisos por tipo de usuario
			asignaPermisos(enumUsuario);

			if (enumUsuario.equals(ETipoUsuario.ADMINISTRADOR)) {

				userSessionBean.setTipoUsuarioText("ADMINISTRADOR PRINCIPAL");

			}
			if (enumUsuario.equals(ETipoUsuario.ANFITRION)) {

				userSessionBean
						.setTipoUsuarioText("BIENVENIDO USUARIO ANFITRION");
			}
			if (enumUsuario.equals(ETipoUsuario.ASESOR)) {

				userSessionBean.setTipoUsuarioText("BIENVENIDO USUARIO ASESOR");
			}

		} else {
			userSessionBean.setLogin(false);
		}
	
		return result;
	}

	// TODO REVISAR LOS PERMISOS POR ROLE
	private void asignaPermisos(ETipoUsuario eTipoUsuario) {

		userSessionBean.setPermisos(new HashMap<String, Boolean>());

		if (eTipoUsuario.equals(ETipoUsuario.ADMINISTRADOR)) {
			//userSessionBean.addPermiso(
			//		EPermisos.VER_CREAR_VISITANTE.getValue(), Boolean.TRUE);
			//userSessionBean.addPermiso(
			//		EPermisos.VER_SOLICITAR_CLIENTE.getValue(), Boolean.TRUE);
			userSessionBean.addPermiso(
					EPermisos.VER_GENERAR_REPORTES.getValue(), Boolean.TRUE);
			userSessionBean.addPermiso(
					EPermisos.VER_ADMINISTRACION.getValue(), Boolean.TRUE);
			
		}
		if (eTipoUsuario.equals(ETipoUsuario.ANFITRION)) {
			userSessionBean.addPermiso(
					EPermisos.VER_CREAR_VISITANTE.getValue(), Boolean.TRUE);
		}
		// SUCURSAL
		if (eTipoUsuario.equals(ETipoUsuario.ASESOR)) {
			userSessionBean.addPermiso(
					EPermisos.VER_SOLICITAR_CLIENTE.getValue(), Boolean.TRUE);
		}
	}

	public void logout() {

		FacesContext facesContext = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) facesContext.getExternalContext()
				.getSession(false);

		session.invalidate();

		try {
			FacesContext.getCurrentInstance().getExternalContext()
					.redirect("/CONTINAUTOS/portalWeb/login.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private CtaTbUsuario authenticate() {
		return DAOFactory.getConsultasDao().validaUsuarioClave(usuario, clave);
	}

	private boolean authorization() {

		boolean result = false;

		/*
		 * ServiceGAMAuthorizationLocator service = new
		 * ServiceGAMAuthorizationLocator();
		 * service.setportGAMAuthorizationPortEndpointAddress
		 * (wsdlAuthorization);
		 * 
		 * try { PortGAMAuthorization port =
		 * service.getportGAMAuthorizationPort();
		 * 
		 * User usuarioAutho = port.getUser(usuario);
		 * 
		 * if(usuarioAutho != null){ Permission permisos[] =
		 * port.getPermissionsUser(usuario, appName);
		 * 
		 * userSessionBean.setPermisos(Arrays.asList(permisos)); result=true; }
		 * 
		 * } catch (ServiceException e) { e.printStackTrace(); } catch
		 * (RemoteException e) { e.printStackTrace(); }
		 */

		result = true;

		return result;
	}

	/**
	 * @return the usuario
	 */
	public String getUsuario() {
		return usuario;
	}

	/**
	 * @param usuario
	 *            the usuario to set
	 */
	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	/**
	 * @return the clave
	 */
	public String getClave() {
		return clave;
	}

	/**
	 * @param clave
	 *            the clave to set
	 */
	public void setClave(String clave) {
		this.clave = clave;
	}

	/**
	 * @return the userSessionBean
	 */
	public UserSessionBean getUserSessionBean() {
		return userSessionBean;
	}

	/**
	 * @param userSessionBean
	 *            the userSessionBean to set
	 */
	public void setUserSessionBean(UserSessionBean userSessionBean) {
		this.userSessionBean = userSessionBean;
	}

	public String getMensajeLogin() {
		return mensajeLogin;
	}

	public void setMensajeLogin(String mensajeLogin) {
		this.mensajeLogin = mensajeLogin;
	}

	public int getIdConcesionario() {
		return idConcesionario;
	}

	public void setIdConcesionario(int idConcesionario) {
		this.idConcesionario = idConcesionario;
	}

}
